Pengantar

Association Rules atau sering juga disebut dengan Market Basket Analysis (MBA) merupakan kegiatan mencari aturan (rules) asosiasi yang menunjukkan hubungan antar item dalam sebuah transaksi. Misalnya, ketika seseorang membeli roti, maka orang itu cenderung akan membeli selai juga. Misalnya lagi apabila kita membeli sikat gigi, maka kita cendrung juga akan membeli pasta giginya. Pola-pola seperti ini akan sangat bermanfaat dalam industri retail seperti dalam hal penetapan diskon produk, promo, penjualan dalam bentuk paket, rekomendasi produk atau penentuan lokasi dari item produk. Association Rules bisa juga diterapkan dalam bidang kesehatan, misalnya untuk mendapatkan hubungan dan interaksi antar faktor resiko seseorang dengan kecenderungan penyakit yang muncul. Dalam bidang manufaktur dapat digunakan untuk mencari pila hubungan antara parameter-parameter proses produksi dengan potensi permasalahan kualitas produk, atau mencari pola-pola desain produk yang diinginkan oleh pelanggan sehingga dapat dijadikan dasar dalam mendesain sebuah produk.

Terdapat beberapa algoritma atau metode untuk menemukan rules, salah satu yang paling populer adalah Algoritma Apriori. Association rules atau aturan asosiasi yang dihasilkan nantinya akan memiliki bentuk sebagai berikut: \[A => B\]

Berdasarkan rumus di atas, A adalah antecedent atau pendahulu sedangkan B adalah consequent atau akibat. Cara membaca rumus di atas adalah jika seseorang membeli item A, maka ada kecenderungan dia juga akan membeli item B. Antecedent dapat berisi satu atau lebih item yang menjadi penanda bahwa ketika kita sudah tahu dia membeli item tersebut maka dia juga akan membeli item consequent. Bentuk hubungan ini tidak bersifat kausalitas atau sebab akibat, tetapi berbentuk co-occurence atau terjadi saling bersamaan.

Association Rules Metrics

Sebelum masuk ke dalam penjelasan tentang algoritme apriori, pertama kita harus mengetahui dahulu metrik atau tolak ukur yang digunakan dalam association rules, yang meliputi Support, Confidence, dan Lift.

Sebagai ilustrasi, kita akan menggunakan data buatan yang berisi 5 transaksi sebagai berikut:

df_dummy <- data.frame(transaction_id = 1:5,
                       items = c("soft drink, mineral water", 
                                 "soft drink", 
                                 "coffee, mineral water, lemon tea",
                                 "bread, coffee, mineral water",
                                 "coffee, mineral water"))

df_dummy

Support

Support menunjukkan proporsi dari jumlah transaksi yang memiliki satu atau lebih item yang muncul secara bersamaan dibandingkan dengan jumlah transaksi secara keseluruhan. Rumus untuk menghitung Support dari suatu item adalah sebagai berikut:

\[Support(B) = \frac{Jumlah\ transaksi\ yang\ berisi\ item\ B }{Jumlah\ seluruh\ transaksi} = \frac{Freq(B)}{N}\]

Berdasarkan data transaksi sebelumnya, maka Support untuk item soft drink adalah sebagai berikut.

\[Support(soft\ drink) = \frac{2}{5} = 0.4\] Artinya 40% dari total transaksi mengandung item soft drink.

Jika itemnya lebih dari satu, maka rumusnya menjadi seperti berikut:

\[Support(A,B) = \frac{Jumlah\ transaksi\ yang\ berisi\ item\ A\ \&\ B }{Jumlah\ seluruh\ transaksi} = \frac{Freq(A \cup B)}{N}\] Berdasarkan data transaksi df_dummy sebelumnya, maka Support untuk item coffee dan mineral water adalah sebagai berikut.

\[Support(coffee, mineral\ water) = \frac{3}{5} = 0.6\] Artinya 60% dari total transaksi mengandung item coffee dan mineral water.

Confidence

Jika Support hanya menunjukkan seberapa banyak proporsi sebuah item di seluruh transaksi, maka Confidence menunjukkan seberapa besar kemungkinan seseorang akan membeli item B jika terdapat item A, atau setara dengan berapa banyak jumlah transaksi yang memiliki item A dan item B diantara transaksi-transaksi yang memiliki item A. Rumus untuk menghitung Confidence adalah sebagai berikut:

\[Confidence(A => B) = \frac{Freq(A\ \cap\ B)}{Freq(A)}\] Berdasarkan data transaksi sebelumnya, maka Confidence untuk item coffee dan mineral water adalah sebagai berikut:

\[Confidence(mineral\ water => coffee) = \frac{3}{4} = 0.75\]

Confidence(mineral water => coffee) menunjukkan rules/aturan jika seseorang membeli mineral water, berapa kemungkinannya dia juga membeli coffee. Maka, kita perlu mencari ada berapa transaksi yang terdapat item mineral water dan coffee dan dibagi dengan seluruh transaksi yang di dalamnya terdapat mineral water. Dari total 5 transaksi yang ada, 4 di antaranya terdapat item mineral water dan dari 4 transaksi tersebut terdapat 3 transaksi yang memiliki coffee maupun mineral water, sehingga nilai Confidence(mineral water => coffee) adalah 3 dari 4 transaksi atau sama degan 75%. Maka, ketika seseorang membeli mineral water, kemungkinan seseorang membeli juga coffee adalah sekitar 75%.

Kelemahan dari Confidence adalah hanya mempertimbangkan seberapa banyak/populer item A saja (perhatikan bagian penyebut) dan tidak memperhatikan seberapa populer item B dalam seluruh transaksi. Perhatikan ilustrasi menggunakan diagram Venn berikut:

Berdasarkan gambar di atas, terdapat 80 transaksi yang berisi Milk dan 13 transaksi berisi Toothbrush. Selain itu, terdapat 10 transaksi di mana terdapat Milk dan Toothbrush. Jika kita memiliki rules bahwa Toothbrush => Milk, maka Confidence-nya adalah:

\[Confidence(Toothbrush => Milk) = \frac{10}{13} = 76.9\%\] Ketika seseorang membeli Toothbrush maka ada kemungkinan 76.9% dia juga akan membeli Milk. Sekilas mungkin masuk akal, tetapi bila diperhatikan, Milk memiliki jumlah transaksi yang besar dan hanya sedikit dari transaksi tersebut yang berkaitan dengan Toothbrush. Karena item Milk sangat populer, maka wajar jika transaksi konsumen yang membeli Toothbrush juga akan cenderung membeli Milk, sehingga meningkatkan nilai Confidence-nya. Solusi untuk mengatasi hal ini, terdapat satu metrik lagi yang menggunakan informasi dari antecedent dan precedent, yakni Lift yang akan dibahas di sub-bab berikutnya.

Lift

Lift, sesuai namanya, menunjukkan seberapa baik sebuah antecedent “mengangkat” atau meningkatkan peluang seseorang membeli item consequent. Jika Confidence hanya mengukur seberapa besar peluang untuk membeli item B jika diketahui item A dibeli, maka Lift mengukur seberapa besar pembelian item A meningkatkan peluang pembelian item B. Rumus untuk menghitung Lift adalah sebagai berikut:

\[Lift(A,B) = \frac{Support(A,B)}{Support(A)\ Support(B)}\] Berdasarkan data transaksi sebelumnya, maka Lift untuk item coffee dan mineral water adalah sebagai berikut.

Pertama, kita hitung terlebih dahulu nilai dari masing-masing Support yang dibutuhkan.

\[Support(mineral\ water, coffee) = \frac{3}{5} = 0.6\]

\[Support(mineral\ water) = \frac{4}{5} = 0.8\]

\[Support(coffee) = \frac{3}{5} = 0.6\]

Setelah mendapatkan semua nilai Support, kemudian masukkan nilai Support yang diperoleh ke dalam rumus untuk mendapatkan nilai Lift dari mineral water => coffee.

\[Lift(mineral\ water => coffee) = \frac{0.6}{0.6\ 0.8} = 1.25\]

Didapatkan nilai Lift(mineral water => coffee) = 1.25. Bagaimana cara menginterpretasikannya? Lift membandingkan peluang ketika keberadaan item satu menjadi sinyal kuat bahwa item lain juga akan dibeli dengan peluang bahwa keberadaan item satu dengan lainnya saling independen dan tidak berkaitan, sehingga:

  • Jika nilai Lift = 1, maka kedua item bersifat independen satu sama lain (tidak ada rules yang terbentuk).
  • Ketika nilai Lift > 1, maka dapat kita katakan bahwa keberadaan mineral water meningkatkan peluang bahwa seseorang juga membeli coffee.
  • Jika nilai Lift < 1, maka pembelian mineral water malah menurunkan peluang bahwa seseorang juga akan membeli coffee.

Algoritma Apriori

Algoritma yang umum digunakan untuk membuat association rules adalah Apriori Algorithm. Berikut merupakan cara kerja Apriori secara umum:

  1. Menentukan nilai minimum Support dan minimum Confidence
  2. Membuat itemsets dari daftar item yang ada
  3. Membandingkan support dari itemsets tersebut dengan minimum Support, apabila nilai support dari suatu item dibawah minimum support maka itemsets tersebut dibuang atau tidak dibuat rules-nya.
  4. Membandingkan antara minimum Confidence dengan Confidence dari rules yang telah memenuhi minimum support. Hanya ambil rules yang memiliki Confidence lebih tinggi dari minimum Confidence.
knitr::include_graphics("image/flow.png")

Sparse matrix

Setelah mengetahui metrics yang digunakan dalam market basket analysis, serta cara kerja dari algoritme apriori. Perlu diingat bahwa struktur data input dalam algoritme Apriori harus berbentuk matrix. Setiap baris dalam matrix yang terbentuk merepresentasikan id transaksi dan kolom merepresentasikan barang yang dibeli.

knitr::include_graphics("image/matrix.png")

Gambar di atas merupakan ilustrasi jika data df_dummy diubah menjadi matrix. Matrix di atas disebut sebagai sparse matrix. Sparse Matrix merupakan matrix dengan elemen utamanya adalah nilai 0.

Load Packages

# data wrangling/data manipulation
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# read data format excel karena dataset yang digunakan format xlsx
library(readxl)

# Association Rules
library(arules)
## Loading required package: Matrix
## 
## Attaching package: 'arules'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
# visualisasi
library(arulesViz)
## Loading required package: grid
## Registered S3 method overwritten by 'seriation':
##   method         from 
##   reorder.hclust gclus

Data Preparation and EDA

# import dataset
retail <- read_excel("data/Online Retail.xlsx")

# lihat struktur dataset
glimpse(retail)
## Rows: 541,909
## Columns: 8
## $ InvoiceNo   <chr> "536365", "536365", "536365", "536365", "536365", "5363...
## $ StockCode   <chr> "85123A", "71053", "84406B", "84029G", "84029E", "22752...
## $ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANT...
## $ Quantity    <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, ...
## $ InvoiceDate <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12-01 0...
## $ UnitPrice   <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1...
## $ CustomerID  <dbl> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850,...
## $ Country     <chr> "United Kingdom", "United Kingdom", "United Kingdom", "...
# Lihat 6 baris teratas dari data
head(retail)
# melihat ringkasan dari data
summary (retail)
##   InvoiceNo          StockCode         Description           Quantity        
##  Length:541909      Length:541909      Length:541909      Min.   :-80995.00  
##  Class :character   Class :character   Class :character   1st Qu.:     1.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :     3.00  
##                                                           Mean   :     9.55  
##                                                           3rd Qu.:    10.00  
##                                                           Max.   : 80995.00  
##                                                                              
##   InvoiceDate                    UnitPrice           CustomerID    
##  Min.   :2010-12-01 08:26:00   Min.   :-11062.06   Min.   :12346   
##  1st Qu.:2011-03-28 11:34:00   1st Qu.:     1.25   1st Qu.:13953   
##  Median :2011-07-19 17:17:00   Median :     2.08   Median :15152   
##  Mean   :2011-07-04 13:34:57   Mean   :     4.61   Mean   :15288   
##  3rd Qu.:2011-10-19 11:27:00   3rd Qu.:     4.13   3rd Qu.:16791   
##  Max.   :2011-12-09 12:50:00   Max.   : 38970.00   Max.   :18287   
##                                                    NA's   :135080  
##    Country         
##  Length:541909     
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 

Bisa dilihat dari ringkasan data pada kolom Quantity terdapat barang terjual negatif, maka kita perlu melakukan beberapa pra proses dalam sebelum kita melakukan market basket analysis

Data Cleansing

Sekarang kita fokus pada kolom Quantity berapa banyak yang nilainya kurang dari 1

retail %>% 
  filter(Quantity < 1)

Hasil di atas menunjukkan bahwa terdapat 10 ribu baris yang memiliki Quantity kurang dari 1, Quantity kurang dari 0 memiliki arti barang tersebut terjual dalam kondisi diskon. Misal kita tidak ingin menggunakan data tersebut karena kita tidak ingin melihat pengaruh diskon pada rules yang terbentuk nanti.

Selain melakukan filtering terhadap data, kita juga perlu melakukan seleksi terhadap kolom apa saja yang akan digunakan. Pada MBA ini kita hanya akan menggunakan kolom InvoiceNo dan Description. Adapun untuk memilih 2 kolom tersebut bisa menggunakan fungsi select()

retail %>% 
  select(InvoiceNo, Description)

Proses filter dan select di atas belum disimpan ke dalam objek, selain itu kedua proses tersebut dapat digabungkan menjadi satu proses dengan bantuan %>% (piping)

retail_clean <- retail %>% 
  filter(Quantity > 0) %>% 
  select(InvoiceNo, Description)

head(retail_clean)

Hasil dari proses filtering dan selection disimpan pada objek retail_clean, objek inilah yang akan kita gunakan dalam proses analisis kedepannya.

Exploratory Data Analysis

Dalam proses ini ada beberapa hal yang harus dicari tahu terlebih dahulu, seperti :

  1. Barang apa yang paling sering dibeli oleh pelanggan?
  2. Berapa banyak barang yang dibeli setiap transaksi?
# Barang apa yang paling sering dibeli oleh pelanggan
retail_clean %>% 
  count(Description, name = "freq", sort = TRUE)

Latihan: Lakukanlah aggregasi data untuk menjawab pertanyaan berapa banyak barang yang dibeli setiap transaksi ?

# your code

Membuat Rules

Sebelum kita membuat rules dari model association rules, kita harus mengelompokkan data berdasarkan InvoiceNo dengan menggunakan fungsi split() untuk mengatasi permasalahan komputasi dari sparse matrix karena dimensi data yang besar. Kita akan mengubah data retail menjadi list

retail_list <- split(retail_clean$Description, retail_clean$InvoiceNo)
head(retail_list, 3)
## $`536365`
## [1] "WHITE HANGING HEART T-LIGHT HOLDER"  "WHITE METAL LANTERN"                
## [3] "CREAM CUPID HEARTS COAT HANGER"      "KNITTED UNION FLAG HOT WATER BOTTLE"
## [5] "RED WOOLLY HOTTIE WHITE HEART."      "SET 7 BABUSHKA NESTING BOXES"       
## [7] "GLASS STAR FROSTED T-LIGHT HOLDER"  
## 
## $`536366`
## [1] "HAND WARMER UNION JACK"    "HAND WARMER RED POLKA DOT"
## 
## $`536367`
##  [1] "ASSORTED COLOUR BIRD ORNAMENT"      "POPPY'S PLAYHOUSE BEDROOM"         
##  [3] "POPPY'S PLAYHOUSE KITCHEN"          "FELTCRAFT PRINCESS CHARLOTTE DOLL" 
##  [5] "IVORY KNITTED MUG COSY"             "BOX OF 6 ASSORTED COLOUR TEASPOONS"
##  [7] "BOX OF VINTAGE JIGSAW BLOCKS"       "BOX OF VINTAGE ALPHABET BLOCKS"    
##  [9] "HOME BUILDING BLOCK WORD"           "LOVE BUILDING BLOCK WORD"          
## [11] "RECIPE BOX WITH METAL HEART"        "DOORMAT NEW ENGLAND"

Setelah mengubah data retail menjadi list, selanjutnya kita akan mengubah data list tersebut menjadi bertipe transaction dengan menggunakan fungsi as()

retail_transaction <- as(retail_list, "transactions")
## Warning in asMethod(object): removing duplicated items in transactions
retail_transaction %>% 
  head(3) %>% 
  inspect()
##     items                                 transactionID
## [1] {CREAM CUPID HEARTS COAT HANGER,                   
##      GLASS STAR FROSTED T-LIGHT HOLDER,                
##      KNITTED UNION FLAG HOT WATER BOTTLE,              
##      RED WOOLLY HOTTIE WHITE HEART.,                   
##      SET 7 BABUSHKA NESTING BOXES,                     
##      WHITE HANGING HEART T-LIGHT HOLDER,               
##      WHITE METAL LANTERN}                        536365
## [2] {HAND WARMER RED POLKA DOT,                        
##      HAND WARMER UNION JACK}                     536366
## [3] {ASSORTED COLOUR BIRD ORNAMENT,                    
##      BOX OF 6 ASSORTED COLOUR TEASPOONS,               
##      BOX OF VINTAGE ALPHABET BLOCKS,                   
##      BOX OF VINTAGE JIGSAW BLOCKS,                     
##      DOORMAT NEW ENGLAND,                              
##      FELTCRAFT PRINCESS CHARLOTTE DOLL,                
##      HOME BUILDING BLOCK WORD,                         
##      IVORY KNITTED MUG COSY,                           
##      LOVE BUILDING BLOCK WORD,                         
##      POPPY'S PLAYHOUSE BEDROOM,                        
##      POPPY'S PLAYHOUSE KITCHEN,                        
##      RECIPE BOX WITH METAL HEART}                536367

Pada dasarnya, data transaction diperoleh dari sparse matrix yang disederhanakan

retail_transaction@data %>% 
  dim()
## [1]  4065 20728

Rules dari algoritme apriori bisa dihasilkan dengan fungsi apriori() dari package arules. Fungsi tersebut menerima beberapa parameter seperti : * data : data transaksi yang ingin digunakan * parameter : * supp : batas bawah (threshold) dari nilai Support * conf : batas bawah (threshold) dari nilai Confidence

Pada kasus ini, kita batasi minimum support-nya adalah 1% (0.01), artinya item atau kombinasi item harus ada minimal 1% transaksi dari total keseluruhan transaksi. Kita juga batasi rules yang akan ditampilkan hanya rules dengan minimal confidence sebesar 0.7.

retail_rules <- apriori(data = retail_transaction, parameter = list(supp = 0.01, conf = 0.7))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.7    0.1    1 none FALSE            TRUE       5    0.01      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 207 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4065 item(s), 20728 transaction(s)] done [0.38s].
## sorting and recoding items ... [779 item(s)] done [0.02s].
## creating transaction tree ... done [0.02s].
## checking subsets of size 1 2 3 4 5 done [0.07s].
## writing ... [218 rule(s)] done [0.00s].
## creating S4 object  ... done [0.01s].

Kita akan melihat rangkuman dari aturan asosiasi yang sudah dihasilkan

summary (retail_rules)
## set of 218 rules
## 
## rule length distribution (lhs + rhs):sizes
##   2   3   4 
##  54 132  32 
## 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.000   3.000   3.000   2.899   3.000   4.000 
## 
## summary of quality measures:
##     support          confidence        coverage            lift       
##  Min.   :0.01003   Min.   :0.7000   Min.   :0.01052   Min.   : 6.499  
##  1st Qu.:0.01057   1st Qu.:0.7371   1st Qu.:0.01356   1st Qu.: 8.379  
##  Median :0.01172   Median :0.7702   Median :0.01510   Median :16.316  
##  Mean   :0.01296   Mean   :0.7845   Mean   :0.01666   Mean   :22.814  
##  3rd Qu.:0.01354   3rd Qu.:0.8263   3rd Qu.:0.01821   3rd Qu.:25.542  
##  Max.   :0.03705   Max.   :0.9587   Max.   :0.05143   Max.   :80.536  
##      count      
##  Min.   :208.0  
##  1st Qu.:219.0  
##  Median :243.0  
##  Mean   :268.7  
##  3rd Qu.:280.8  
##  Max.   :768.0  
## 
## mining info:
##                data ntransactions support confidence
##  retail_transaction         20728    0.01        0.7

Berdasarkan keluaran hasil di atas diketahui bahwa rules yang dihasilkan sebanyak 218 rules, di mana rules terpanjang terdiri dari 4 item dengan jumlah rules sebanyak 32. Selain itu, kita bisa mengetahui nilai statistik dari support, confidence, coverage serta lift.

Hasil

Rules

Fungsi apriori di atas menghasilkan 218 rules, kita bisa menampilkan beberapa rules saja berdasarkan kriteria yang kita pilih. Bila ingin melihat 5 rules teratas berdasarkan nilai confidence tertinggi dapat menggunakan kode di bawah ini:

rules_conf <- head(retail_rules, 5, by = "confidence")
inspect(rules_conf)
##     lhs                                      rhs                                     support confidence   coverage     lift count
## [1] {JAM MAKING SET PRINTED,                                                                                                     
##      SUKI  SHOULDER BAG}                  => {DOTCOM POSTAGE}                     0.01008298  0.9587156 0.01051717 28.06816   209
## [2] {REGENCY TEA PLATE PINK,                                                                                                     
##      REGENCY TEA PLATE ROSES}             => {REGENCY TEA PLATE GREEN}            0.01230220  0.9479554 0.01297761 51.57275   255
## [3] {HERB MARKER THYME}                   => {HERB MARKER ROSEMARY}               0.01066191  0.9324895 0.01143381 80.53601   221
## [4] {WOODEN HEART CHRISTMAS SCANDINAVIAN,                                                                                        
##      WOODEN TREE CHRISTMAS SCANDINAVIAN}  => {WOODEN STAR CHRISTMAS SCANDINAVIAN} 0.01114435  0.9277108 0.01201274 37.55779   231
## [5] {HERB MARKER ROSEMARY}                => {HERB MARKER THYME}                  0.01066191  0.9208333 0.01157854 80.53601   221

Nilai Confidence yang tinggi menunjukkan seberapa besar peluang membeli item lainnya jika kita telah membeli suatu item. Rules dengan Confidence tertinggi adalah {jam making set printed, suki shoulder bag} => {dotcom postage}, artinya ketika seorang pelanggan membeli 2 item tersebut, kemungkinan besar pelanggan juga akan membeli dotcom postage karena dari seluruh transaksi yang berisi 2 item pertama yang dibeli, 0.958 atau 95.8% pembelian juga terdapat item dotcom postage.

Kelemahan apabila melihat rules berdasarkan nilai Confidence adalah, Confidence hanya melihat dari transaksi antecedent dan tidak memperhatikan transaksi-transaksi lain dari consequent. Maka, kita perlu melihat seberapa baik antecedent meningkatkan peluang untuk pelanggan membeli item lainnya jika kita mengetahui dia telah membeli sekumpulan barang-barang tertentu dibandingkan ketika kita tidak tahu bahwa pelanggan membeli barang-barang tersebut. Oleh sebab itu, mari kita periksa 5 rules dengan Lift tertinggi.

rules_lift <- head(retail_rules, n = 10, by = "lift")
inspect(rules_lift)
##      lhs                       rhs                    support    confidence
## [1]  {HERB MARKER THYME}    => {HERB MARKER ROSEMARY} 0.01066191 0.9324895 
## [2]  {HERB MARKER ROSEMARY} => {HERB MARKER THYME}    0.01066191 0.9208333 
## [3]  {HERB MARKER THYME}    => {HERB MARKER PARSLEY}  0.01027596 0.8987342 
## [4]  {HERB MARKER PARSLEY}  => {HERB MARKER THYME}    0.01027596 0.8949580 
## [5]  {HERB MARKER PARSLEY}  => {HERB MARKER ROSEMARY} 0.01037244 0.9033613 
## [6]  {HERB MARKER ROSEMARY} => {HERB MARKER PARSLEY}  0.01037244 0.8958333 
## [7]  {HERB MARKER MINT}     => {HERB MARKER PARSLEY}  0.01022771 0.8833333 
## [8]  {HERB MARKER PARSLEY}  => {HERB MARKER MINT}     0.01022771 0.8907563 
## [9]  {HERB MARKER BASIL}    => {HERB MARKER ROSEMARY} 0.01032420 0.8842975 
## [10] {HERB MARKER ROSEMARY} => {HERB MARKER BASIL}    0.01032420 0.8916667 
##      coverage   lift     count
## [1]  0.01143381 80.53601 221  
## [2]  0.01157854 80.53601 221  
## [3]  0.01143381 78.27295 213  
## [4]  0.01148205 78.27295 213  
## [5]  0.01148205 78.02031 215  
## [6]  0.01157854 78.02031 215  
## [7]  0.01157854 76.93165 212  
## [8]  0.01148205 76.93165 212  
## [9]  0.01167503 76.37383 214  
## [10] 0.01157854 76.37383 214

Berdasarkan hasil di atas, rules {herb marker thyme} => {herb marker rosemary} memiliki Lift terbesar dengan nilai 80. Ketika nilai Lift lebih besar dari 1, maka pembelian herb marker thyme memang meningkatkan peluang pembeli untuk membeli herb marker rosemary. Jika kita bandingkan, rules dengan Confidence tertinggi, yakni {jam making set printed, suki shoulder bag} => {dotcom postage} ternyata hanya memiliki Lift sebesar 28. Meskipun pembelian kedua item tersebut meningkatkan peluang untuk membeli dotcom postage, tetapi efeknya tidak terlalu besar jika dibandingkan dengan rules lainnya.

Visualisasi Output

Visualisasi digunakan untuk mempermudah pemahaman terhadap rules yang sudah dibuat. Untuk memvisualisasikan rules yang sudah terbentuk kita dapat menggunakan fungsi plotly_arules() dari packages arulesViz

plotly_arules(retail_rules)
## Warning: 'plotly_arules' is deprecated.
## Use 'plot' instead.
## See help("Deprecated")
## To reduce overplotting, jitter is added! Use jitter = 0 to prevent jitter.

Berdasarkan 218 rules yang dihasilkan, hanya terdapat beberapa rules yang memiliki Confidence dan Lift yang tinggi, sementara sebagian besar rules hanya memiliki Lift tinggi atau Confidence tinggi saja. Sedangkan, dari semua rules yang dihasilkan, tidak terdapat rules yang memilki Lift kurang dari 1, sehingga dapat disimpulkan bahwa semua rules yang dihasilkan dapat meningkatkan peluang untuk pembelian item tertentu,

Dari rules yang dihasilkan dapat dilihat juga hubungan antar rules dengan menggunakan graph atau plot(), dengan tiap lingkaran atau titik adalah rules dan panah sebagai hubungan antara rules dengan item barangnya.

plot(retail_rules, 
     method = "graph", 
     measure = "lift",  
     engine = "htmlwidget" # membuat grafik interaktif
     )
## Warning: Too many rules supplied. Only plotting the best 100 rules using lift
## (change control parameter max if needed)

Pada grafik yang dihasilkan di atas, terdapat beberapa cluster atau kelompok rules yang saling berinteraksi satu sama lain. Salah satu yang terbesar adalah cluster yang berisi charlotte bag yang saling terhubung. Cluster lainnya yang berisi banyak rules yang saling terkoneksi adalah clusterherb marker.

Kita ambil contoh cluster charlotte bag, yang hanya terdiri dari 5 item/produk, yakni woodland charlotte bag, strawberry charlotte bag, red retrospot charlotte bag, charlotte bag pink polkadot, charlotte bag suki design. Berdasarkan interaksi 5 item tersebut, dihasilkan puluhan rules/aturan yang berbeda. Apabila diperhatikan ke 5 item tersebut saling terhubung, maka hal ini menunjukkan adanya hubungan keterkaitan antara rules satu dengan lainnya. Oleh karena kita meyakini adanya hubungan keterkaitan yang kuat antara item satu dengan lainnya di dalam cluster tersebut, maka kita bisa membuat sebuah promo dalam bentuk **Bundle Package*; yakni paket lengkap yang berisi 5 item tersebut.